package facade;

import facade.exception.*;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import service.ServiceFactory;
import service.exception.DuplicateObjectException;
import service.exception.ObjectNotFoundException;
import valueObject.*;

@Stateless
@LocalBean
@TransactionManagement(TransactionManagementType.CONTAINER)
public class DesarrolloHumanoFacade {

    @PersistenceContext
    EntityManager em;
    
    //HU A1
    public void habilitarFormulario(FormularioVO formularioVO) throws AlreadyExistsFormularioException{
        try {
            ServiceFactory.getInstance().getFormularioService().create(formularioVO, em);
        } catch (DuplicateObjectException ex) {
            throw new AlreadyExistsFormularioException();
        }
    }
    
    //HU A1 - U6
    public FormularioVO hayUnFormularioActivo() throws NotActiveFormularioFoundException{
        FormularioVO formularioVO;
        try {
            formularioVO = ServiceFactory.getInstance().getFormularioService().findFormularioActual(em);
            return formularioVO;
        } catch (ObjectNotFoundException ex) {
            throw new NotActiveFormularioFoundException();
        }
    }
    
    //HU U1 - U2 - U3 - U5 - U7
    public void registrarUsuarioFinal(UsuarioRegistradoVO usuarioRegistradoVO) throws AlreadyUsuarioRegistradoExistsException{
        try {
            ServiceFactory.getInstance().getUsuarioRegistradoService().verificaUsuarioEnFormulario(usuarioRegistradoVO, em);
            int id = ServiceFactory.getInstance().getUsuarioRegistradoService().create(usuarioRegistradoVO, em);
            UsuarioRegistradoVO enviarCorreoA = ServiceFactory.getInstance().getUsuarioRegistradoService().findById(id, em);
            ServiceFactory.getInstance().getMailService().sendRegistroInformation(enviarCorreoA);
        } catch (DuplicateObjectException ex) {
            throw new AlreadyUsuarioRegistradoExistsException();
        } catch(ObjectNotFoundException ex){
            throw new AlreadyUsuarioRegistradoExistsException();
        }
    }
    
    
    // Métodos utilitarios
    public TipoDeContratacionVO buscarTipoDeContratacionVO(int id){
        try {
            return ServiceFactory.getInstance().getTipoDeContratacionService().findById(id, em);
        } catch (ObjectNotFoundException ex) {
            return null;
        }
    }
    
    public PuntoDeEncuentroVO buscarPuntoDeEncuentroVO(int id){
        try {
            return ServiceFactory.getInstance().getPuntoDeEncuentroService().findById(id, em);
        } catch (ObjectNotFoundException ex) {
            return null;
        }
    }
    
    public AcompananteVO findAcompananteById(int id) throws NotAcompananteFoundException{
        try {
            return ServiceFactory.getInstance().getAcompananteService().findById(id, em);
        } catch (ObjectNotFoundException ex) {
            throw new NotAcompananteFoundException();
        }
    }
    
    public void acceptUsuarioRegistrado(UsuarioRegistradoVO usuarioRegistradoVO) throws NotUsuarioRegistradoFoundException{
        try {
            ServiceFactory.getInstance().getUsuarioRegistradoService().update(usuarioRegistradoVO, em);
            ServiceFactory.getInstance().getMailService().sendAceptadoInfo(usuarioRegistradoVO);
        } catch (ObjectNotFoundException ex) {
            throw new NotUsuarioRegistradoFoundException();
        }
    }
    
    public void confirmUsuarioRegistrado(UsuarioRegistradoVO usuarioRegistradoVO) throws NotUsuarioRegistradoFoundException{
        try {
            ServiceFactory.getInstance().getUsuarioRegistradoService().update(usuarioRegistradoVO, em);
        } catch (ObjectNotFoundException ex) {
            throw new NotUsuarioRegistradoFoundException();
        }
    }
    
    public UsuarioRegistradoVO findUsuarioRegistradoVOById(int id) throws NotUsuarioRegistradoFoundException{
        try {
            return ServiceFactory.getInstance().getUsuarioRegistradoService().findById(id, em);
        } catch (ObjectNotFoundException ex) {
            throw new NotUsuarioRegistradoFoundException();
        }
    }
}
